/*
 * Estructura usada para el manejo de indices de clausulas
 * params: 	bool
 *  		i
 * pos: 	 Indice de la clausula
 * bool: (representado por un entero) dice si en la clausula i
 * 		 la variables tiene una negacion o no
 * La utilidad de esta estructura es que nos puede decir si el literal
 * aparece en el indice pos como positivo (bool == 1) o
 * negativo (bool == -1)
 */
typedef struct {
	int pos;
	int bool; 	// -1 neg, 1 pos
} ParOrdenado;

typedef struct {
	short int numVariables; //Parecido al cola de Variable
	short int* indices; 	//indece en el arreglo de variables
	short int sinAsignar; 	//Cuantas quedan sin asignar
	short int satisfecho; 	//Si se cumplio o no la clausula
} Clausula;

typedef struct {
	short int asignacion; 	// -1 para no asignado, 0 para False, 1 para True
	short int flipped;
	short int cola; 	  	// Proximo indice a usar en el
							// arreglo de indices (NUEVO)
	ParOrdenado* indices;	// clausulas a la que pertenece
							// la variable en particular
	int tamIndices;			// Tamano del arreglo de indices (NUEVO)
} Variable;

/*
 * Estructura de salida para algunas funciones
 */
typedef struct {
	Clausula *claus;
	Variable *varias;
} OutPut;

/*
 * Tipo Evento. Tiene un tipo (1 asignacion, -1 implicacion)
 * tiene un indice de la variable involucrada. El valor
 * correspondiente de esa variables
 * y un apuntador al evento siguiente
 */
typedef struct {
	short int tipo;
	int indiceVariable;
	short int value;
	void *eventoSig;
} Evento;

/*
 * Pila de eventos
 */
typedef struct {
	int tam;
	Evento *tope;
} Pila;

